home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / psion / flash < prev    next >
Text File  |  1995-03-31  |  9KB  |  223 lines

  1. PSIONICS FILE - FLASH
  2. =====================
  3. Format of Flash SSD cards and ROMs
  4. Last modified 1994-09-12
  5. ==================================
  6.  
  7. This file describes information about the structure of existing types of
  8. Flash cards. It does not apply to RAM cards, and might not apply to new types
  9. of SSDs that may become available in the future. It does, however, appear to
  10. apply to the ROM in the 3-Link pod and the SSD ROM used to ship the
  11. Spreadsheet.
  12.  
  13. The term "erased flash card" is one that was partially formatted, after which
  14. the format was stopped, and then reformatted. This causes the contents of the
  15. start of the flash card, which is normally preserved by the formatting process
  16. (see Psionics file FILEIO) to be lost.
  17.  
  18. All "trip" values are offsets from the start of the card. The term "NULL"
  19. means the value $FFFFFF.
  20.  
  21. The flash card always begins with:
  22.   Offset  0 (word): $F1A5 ('Flas')
  23.   Offset  2 (long): unique ID of SSD
  24.   Offset  6 (word): unknown @only ever seen 1@
  25.   Offset  8 (trip): unknown @only ever seen 1@
  26.   Offset 11 (trip): pointer to the root directory entry
  27.   Offset 14 to  21: volume name
  28.   Offset 22 to  24: volume extension
  29.   Offset 25 (long): count of times flash card has been formatted, or
  30.                     $FFFFFFFF for ROMs
  31. It then continues with either:
  32.   Offset 29 (word): size of the card in 256 byte units (i.e. $1000 = 1Mb)
  33.   Offset 31 (word): unknown @only ever seen $FFFF@
  34.   Offset 33 onward: identity string
  35. Or:
  36.   Offset 29 onward: identity string
  37. The first form is seen on flash cards, and the second on ROMs and erased flash
  38. cards.
  39.  
  40. The unique ID is placed there when the SSD is first created, and is preserved
  41. even when the SSD is formatted. There is no obvious pattern to the ID's.
  42. Note that different 3-Link pods have different unique IDs.
  43.  
  44. If the first byte of the volume name is 00, the volume name is not in
  45. offsets 14 to 24, but is instead found in a special file record within the
  46. root directory.
  47.  
  48. The identity string is terminated by a zero byte or a $FF byte. The identity
  49. strings seen to date are:
  50.     "PSION 1.0 01/80"
  51.     "PSION 1.0 06/80"
  52.     "PSION 1.0"
  53.     "Copyright (c) Psion Plc 1991"
  54. The first two were seen on flash cards, the third on an erased flash card,
  55. and the last on both the 3-Link pod ROM and the spreadsheet SSD ROM.
  56.  
  57.  
  58. The rest of the flash card is divided into records (unused portions of the
  59. card are full of $FF bytes).
  60.  
  61. The root directory entry is a filing system record. The directory name is
  62. "ROOT.".
  63.  
  64. Filing system records represent entries in directories: other directories,
  65. files, and volume names. A filing system record is 31 bytes if it represents
  66. a file, and 26 bytes otherwise:
  67.  
  68.   Offset  0 (trip): pointer to the next entry in same directory
  69.   Offset  3 to  10: entry name
  70.   Offset 11 to  13: entry extension
  71.   Offset 14 (byte): flags
  72.   Offset 15 (trip): pointer to first entry record
  73.   Offset 18 (trip): pointer to alternate record
  74.   Offset 21 (byte): entry properties
  75.   Offset 22 (word): time code
  76.   Offset 24 (word): date code
  77.   Offset 26 (trip): (file only) pointer to start of first data record
  78.   Offset 29 (word): (file only) length of first data record
  79.  
  80. The flags are as follows:
  81.   Bit 0: 1 = entry still valid, 0 = entry deleted
  82.   Bit 1: 1 = properties, time, and date valid
  83.   Bit 2: 1 = file or volume name, 0 = directory
  84.   Bit 3: 1 = no entry record (so NULL at offset 15)
  85.   Bit 4: 1 = no alternate record (so NULL at offset 18)
  86.   Bit 5: 1 = no more entries in same directory (so NULL at offset 0)
  87.   Bit 6: all entries seen so far have this bit set to 1
  88.   Bit 7: all entries seen so far have this bit set to 1
  89.  
  90. The first entry record is:
  91.   for files:        first continuation record of file; if the pointer is NULL,
  92.                     the file only contains one data record
  93.   for directories:  filing system record of first directory entry; if the
  94.                     pointer is NULL, the directory is empty
  95.   for volume names: all entries seen so far have a NULL pointer
  96.  
  97. If the alternate record exists, then most of the data in the record pointing
  98. to the alternate record should be ignored, and replaced by the corresponding
  99. data in the alternate record. The alternate record is:
  100.   for files:        a continuation record; ignore the first entry record
  101.                     and the data record in the original record
  102.   for directories:  alternate records are not used
  103.   for volume names: alternate records are not used
  104.  
  105. The entry properties are:
  106.   Bit 0: 1 = read-only file
  107.   Bit 1: 1 = hidden file
  108.   Bit 2: 1 = system file
  109.   Bit 3: 1 = is a volume name
  110.   Bit 4: 1 = directory
  111.   Bit 5: 1 = modified
  112.  
  113. The time code is: $800 * hour + $20 * minute + second / 2.
  114. The date code is: $200 * (year - 1980) + $20 * month + date.
  115.  
  116. A file is represented by a linked list of records. The first record is the
  117. filing system record, or its alternate, and the remaining records are all
  118. continuation records. A continuation record is 17 bytes:
  119.  
  120.   Offset  0 (byte): flags (as above)
  121.   Offset  1 (trip): pointer to next continuation record
  122.   Offset  4 (trip): pointer to alternate continuation record
  123.   Offset  7 (trip): pointer to data record
  124.   Offset 10 (word): length of data record, or $FFFF if it is unknown and the
  125.                     file is still open
  126.   Offset 12 (byte): entry properties
  127.   Offset 13 (word): time code
  128.   Offset 15 (word): date code
  129.  
  130. Note that bits 5, 2, and 0 of the flags will always be set, and that bits 4
  131. and 3 refer to offsets 1 and 4 respectively. In addition, it is possible for
  132. bit 3 to be clear but for there to be no next continuation record.
  133.  
  134. To examine all the data in a file, start at the filing system record, and then
  135. proceed as follows for each record in turn:
  136.     If flag bit 4 is set, go to the alternate record and repeat this step.
  137.     Otherwise the next part of the file is given by the data pointer and length
  138.     within this record.
  139.     After using the data: if flag bit 3 is clear and the next continuation
  140.     record pointer is not null, go to that record, starting by examining flag
  141.     bit 4. Otherwise the end of file has been reached.
  142.  
  143. As files are modified, the records on the flash card become out of date.
  144. For example, data that has been overwritten will remain on the card. In
  145. particular, the properties, time, and date bytes of records will remain even
  146. when they are not valid (as indicated by flag bit 1). Also note that a
  147. change to a file may cause several continuation records to be written at the
  148. same time. In these circumstances, only one of these will have the correct
  149. properties, time, and date, and the others will be written without them, and
  150. with some other record overlapping these 5 bytes.
  151.  
  152.  
  153. Reading flash cards
  154. -------------------
  155.  
  156. On later versions of EPOC, flash cards can be read with FilLocReadPDD (see
  157. Psionics file SYSCALLS). If this is not available, the following code can be
  158. used to read flash cards. The left four columns give individual bytes; the
  159. right column is the bytes reorganized as long words.
  160.  
  161.   EB  3A  55  E8   E8553AEB
  162.   95  00  83  EC   EC830095
  163.   0E  8B  F4  8D   8DF48B0E
  164.   7E  28  BA  21   21BA287E
  165.   DD  2B  DB  B4   B4DB2BDD
  166.   0A  CD  85  83   8385CD0A
  167.   C4  0E  8B  D8   D88B0EC4
  168.   B4  02  CD  85   85CD02B4
  169.   89  46  00  89   89004689
  170.   5E  02  CD  8F   8FCD025E
  171.   8C  46  32  B4   B432468C
  172.   00  CD  88  80   8088CD00
  173.   E4  0F  89  46   46890FE4
  174.   30  9C  FA  1E   1EFA9C30
  175.   07  9D  5D  CB   CB5D9D07
  176.   83  FB  04  72   7204FB83
  177.   05  B8  FC  FF   FFFCB805
  178.   EB  51  8B  F0   F08B51EB
  179.   55  E8  4F  00   004FE855
  180.   88  5E  20  FF   FF205E88
  181.   36  12  00  8D   8D001236
  182.   46  04  A3  12   12A30446
  183.   00  FF  36  20   2036FF00
  184.   00  80  26  20   20268000
  185.   00  00  E4  14   14E40000
  186.   C4  7E  30  26   26307EC4
  187.   FE  45  0D  1E   1E0D45FE
  188.   07  8B  FA  B0   B0FA8B07
  189.   00  FF  5E  00   005EFF00
  190.   98  8B  D8  C4   C4D88B98
  191.   7E  30  26  FE   FE26307E
  192.   4D  0D  9C  FA   FA9C0D4D
  193.   1E  07  9D  8F   8F9D071E
  194.   06  20  00  80   80002006
  195.   3E  20  00  00   0000203E
  196.   74  02  E6  14   14E60274
  197.   8B  C3  8F  06   068FC38B
  198.   12  00  5D  CB   CB5D0012
  199.   58  FF  E0  E8   E8E0FF58
  200.   FA  FF  05  06   0605FFFA
  201.   00  8B  E8  C3   C3E88B00
  202.   00  00  00  00   00000000
  203.   00  00  00  00   00000000
  204.   00  00  00  00   00000000
  205.   00  00  00  00   00000000
  206.   00  00  00  00   00000000
  207.   00  00  00  00   00000000
  208.   00  00  00  00   00000000
  209.   00  00  00  00   00000000
  210.   00  00  00  00   00000000
  211.   00  00  00  00   00000000
  212.   4C  4F  43  2E   2E434F4C
  213.   54  59  31  00   00315954
  214.   00  00  00  00   00000000
  215.  
  216. If this code is placed at location bin%, then to initialize the code, call
  217.     USR (bin% + 2, 0, 0, 0, 0)
  218. Then, to copy date from the flash card:
  219.     rc% = USR (bin%, ADDR (loc&), drive%, length%, ADDR (buffer))
  220. copies length% bytes into the buffer, starting from address loc& on card
  221. drive% (0 is A:, 1 is B:, 2 is C:, etc.). A returned value of 0 indicates
  222. success.
  223.